home *** CD-ROM | disk | FTP | other *** search
/ IRIX Base Documentation 2001 May / SGI IRIX Base Documentation 2001 May.iso / usr / share / catman / u_man / cat3 / Tcl / tracevar.z / tracevar
Encoding:
Text File  |  1998-10-30  |  24.3 KB  |  397 lines

  1.  
  2.  
  3.  
  4. TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))                                          TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))
  5.  
  6.  
  7.  
  8. NNNNAAAAMMMMEEEE
  9.      Tcl_TraceVar, Tcl_TraceVar2, Tcl_UntraceVar, Tcl_UntraceVar2,
  10.      Tcl_VarTraceInfo, Tcl_VarTraceInfo2 - monitor accesses to a variable
  11.  
  12. SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
  13.      ####iiiinnnncccclllluuuuddddeeee <<<<ttttccccllll....hhhh>>>>
  14.  
  15.      int
  16.      TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((_i_n_t_e_r_p, _v_a_r_N_a_m_e, _f_l_a_g_s, _p_r_o_c, _c_l_i_e_n_t_D_a_t_a))))
  17.  
  18.      int
  19.      TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr2222((((_i_n_t_e_r_p, _n_a_m_e_1, _n_a_m_e_2, _f_l_a_g_s, _p_r_o_c, _c_l_i_e_n_t_D_a_t_a))))
  20.  
  21.      TTTTccccllll____UUUUnnnnttttrrrraaaacccceeeeVVVVaaaarrrr((((_i_n_t_e_r_p, _v_a_r_N_a_m_e, _f_l_a_g_s, _p_r_o_c, _c_l_i_e_n_t_D_a_t_a))))
  22.  
  23.      TTTTccccllll____UUUUnnnnttttrrrraaaacccceeeeVVVVaaaarrrr2222((((_i_n_t_e_r_p, _n_a_m_e_1, _n_a_m_e_2, _f_l_a_g_s, _p_r_o_c, _c_l_i_e_n_t_D_a_t_a))))
  24.  
  25.      ClientData
  26.      TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo((((_i_n_t_e_r_p, _v_a_r_N_a_m_e, _f_l_a_g_s, _p_r_o_c, _p_r_e_v_C_l_i_e_n_t_D_a_t_a))))
  27.  
  28.      ClientData
  29.      TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo2222((((_i_n_t_e_r_p, _n_a_m_e_1, _n_a_m_e_2, _f_l_a_g_s, _p_r_o_c, _p_r_e_v_C_l_i_e_n_t_D_a_t_a))))
  30.  
  31. AAAARRRRGGGGUUUUMMMMEEEENNNNTTTTSSSS
  32.      Tcl_Interp         *_i_n_t_e_r_p          (in)      Interpreter containing
  33.                                                    variable.
  34.  
  35.      char               *_v_a_r_N_a_m_e         (in)      Name of variable.  May
  36.                                                    refer to a scalar variable,
  37.                                                    to an array variable with
  38.                                                    no index, or to an array
  39.                                                    variable with a
  40.                                                    parenthesized index.  If   |
  41.                                                    the name references an     |
  42.                                                    element of an array, then  |
  43.                                                    it must be in writable     |
  44.                                                    memory:  Tcl will make     |
  45.                                                    temporary modifications to |
  46.                                                    it while looking up the    |
  47.                                                    name.
  48.  
  49.      int                _f_l_a_g_s            (in)      OR-ed combination of the
  50.                                                    values TCL_TRACE_READS,
  51.                                                    TCL_TRACE_WRITES, and
  52.                                                    TCL_TRACE_UNSETS, and
  53.                                                    TCL_GLOBAL_ONLY.  Not all
  54.                                                    flags are used by all
  55.                                                    procedures.  See below for
  56.                                                    more information.
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.                                                                         PPPPaaaaggggeeee 1111
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))                                          TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))
  71.  
  72.  
  73.  
  74.      Tcl_VarTraceProc   *_p_r_o_c            (in)      Procedure to invoke
  75.                                                    whenever one of the traced
  76.                                                    operations occurs.
  77.  
  78.      ClientData         _c_l_i_e_n_t_D_a_t_a       (in)      Arbitrary one-word value to
  79.                                                    pass to _p_r_o_c.
  80.  
  81.      char               *_n_a_m_e_1           (in)      Name of scalar or array
  82.                                                    variable (without array
  83.                                                    index).
  84.  
  85.      char               *_n_a_m_e_2           (in)      For a trace on an element
  86.                                                    of an array, gives the
  87.                                                    index of the element.  For
  88.                                                    traces on scalar variables
  89.                                                    or on whole arrays, is
  90.                                                    NULL.
  91.  
  92.      ClientData         _p_r_e_v_C_l_i_e_n_t_D_a_t_a   (in)      If non-NULL, gives last
  93.                                                    value returned by
  94.                                                    TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo or
  95.                                                    TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo2222, so this
  96.                                                    call will return
  97.                                                    information about next
  98.                                                    trace.  If NULL, this call
  99.                                                    will return information
  100.                                                    about first trace.
  101.  
  102.  
  103. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  104.      TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr allows a C procedure to monitor and control access to a Tcl
  105.      variable, so that the C procedure is invoked whenever the variable is
  106.      read or written or unset.  If the trace is created successfully then
  107.      TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr returns TCL_OK.  If an error occurred (e.g. _v_a_r_N_a_m_e
  108.      specifies an element of an array, but the actual variable isn't an array)
  109.      then TCL_ERROR is returned and an error message is left in _i_n_t_e_r_p-
  110.      >_r_e_s_u_l_t.
  111.  
  112.      The _f_l_a_g_s argument to TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr indicates when the trace procedure is
  113.      to be invoked and provides information for setting up the trace.  It
  114.      consists of an OR-ed combination of any of the following values:
  115.  
  116.      TTTTCCCCLLLL____GGGGLLLLOOOOBBBBAAAALLLL____OOOONNNNLLLLYYYY
  117.           Normally, the variable will be looked up at the current level of
  118.           procedure call;  if this bit is set then the variable will be looked
  119.           up at global level, ignoring any active procedures.
  120.  
  121.      TTTTCCCCLLLL____TTTTRRRRAAAACCCCEEEE____RRRREEEEAAAADDDDSSSS
  122.           Invoke _p_r_o_c whenever an attempt is made to read the variable.
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.                                                                         PPPPaaaaggggeeee 2222
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))                                          TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))
  137.  
  138.  
  139.  
  140.      TTTTCCCCLLLL____TTTTRRRRAAAACCCCEEEE____WWWWRRRRIIIITTTTEEEESSSS
  141.           Invoke _p_r_o_c whenever an attempt is made to modify the variable.
  142.  
  143.      TTTTCCCCLLLL____TTTTRRRRAAAACCCCEEEE____UUUUNNNNSSSSEEEETTTTSSSS
  144.           Invoke _p_r_o_c whenever the variable is unset.  A variable may be unset
  145.           either explicitly by an uuuunnnnsssseeeetttt command, or implicitly when a
  146.           procedure returns (its local variables are automatically unset) or
  147.           when the interpreter is deleted (all variables are automatically
  148.           unset).
  149.  
  150.      Whenever one of the specified operations occurs on the variable, _p_r_o_c
  151.      will be invoked.  It should have arguments and result that match the type
  152.      TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeePPPPrrrroooocccc:
  153.           typedef char *Tcl_VarTraceProc(
  154.                ClientData _c_l_i_e_n_t_D_a_t_a,
  155.                Tcl_Interp *_i_n_t_e_r_p,
  156.                char *_n_a_m_e_1,
  157.                char *_n_a_m_e_2,
  158.                int _f_l_a_g_s);
  159.      The _c_l_i_e_n_t_D_a_t_a and _i_n_t_e_r_p parameters will have the same values as those
  160.      passed to TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr when the trace was created.  _C_l_i_e_n_t_D_a_t_a typically
  161.      points to an application-specific data structure that describes what to
  162.      do when _p_r_o_c is invoked.  _N_a_m_e_1 and _n_a_m_e_2 give the name of the traced
  163.      variable in the normal two-part form (see the description of
  164.      TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr2222 below for details).  _F_l_a_g_s is an OR-ed combination of bits
  165.      providing several pieces of information.  One of the bits
  166.      TCL_TRACE_READS, TCL_TRACE_WRITES, or TCL_TRACE_UNSETS will be set in
  167.      _f_l_a_g_s to indicate which operation is being performed on the variable.
  168.      The bit TCL_GLOBAL_ONLY will be set whenever the variable being accessed
  169.      is a global one not accessible from the current level of procedure call:
  170.      the trace procedure will need to pass this flag back to variable-related
  171.      procedures like TTTTccccllll____GGGGeeeettttVVVVaaaarrrr if it attempts to access the variable.  The
  172.      bit TCL_TRACE_DESTROYED will be set in _f_l_a_g_s if the trace is about to be
  173.      destroyed;  this information may be useful to _p_r_o_c so that it can clean
  174.      up its own internal data structures (see the section TCL_TRACE_DESTROYED
  175.      below for more details).  Lastly, the bit TCL_INTERP_DESTROYED will be
  176.      set if the entire interpreter is being destroyed.  When this bit is set,
  177.      _p_r_o_c must be especially careful in the things it does (see the section
  178.      TCL_INTERP_DESTROYED below).  The trace procedure's return value should
  179.      normally be NULL;  see ERROR RETURNS below for information on other
  180.      possibilities.
  181.  
  182.      TTTTccccllll____UUUUnnnnttttrrrraaaacccceeeeVVVVaaaarrrr may be used to remove a trace.  If the variable specified
  183.      by _i_n_t_e_r_p, _v_a_r_N_a_m_e, and _f_l_a_g_s has a trace set with _f_l_a_g_s, _p_r_o_c, and
  184.      _c_l_i_e_n_t_D_a_t_a, then the corresponding trace is removed.  If no such trace
  185.      exists, then the call to TTTTccccllll____UUUUnnnnttttrrrraaaacccceeeeVVVVaaaarrrr has no effect.  The same bits are
  186.      valid for _f_l_a_g_s as for calls to TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr.
  187.  
  188.      TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo may be used to retrieve information about traces set on
  189.      a given variable.  The return value from TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo is the
  190.      _c_l_i_e_n_t_D_a_t_a associated with a particular trace.  The trace must be on the
  191.      variable specified by the _i_n_t_e_r_p, _v_a_r_N_a_m_e, and _f_l_a_g_s arguments (only the
  192.  
  193.  
  194.  
  195.                                                                         PPPPaaaaggggeeee 3333
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))                                          TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))
  203.  
  204.  
  205.  
  206.      TCL_GLOBAL_ONLY bit from _f_l_a_g_s is used;  other bits are ignored) and its
  207.      trace procedure must the same as the _p_r_o_c argument.  If the
  208.      _p_r_e_v_C_l_i_e_n_t_D_a_t_a argument is NULL then the return value corresponds to the
  209.      first (most recently created) matching trace, or NULL if there are no
  210.      matching traces.  If the _p_r_e_v_C_l_i_e_n_t_D_a_t_a argument isn't NULL, then it
  211.      should be the return value from a previous call to TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo.  In
  212.      this case, the new return value will correspond to the next matching
  213.      trace after the one whose _c_l_i_e_n_t_D_a_t_a matches _p_r_e_v_C_l_i_e_n_t_D_a_t_a, or NULL if
  214.      no trace matches _p_r_e_v_C_l_i_e_n_t_D_a_t_a or if there are no more matching traces
  215.      after it.  This mechanism makes it possible to step through all of the
  216.      traces for a given variable that have the same _p_r_o_c.
  217.  
  218.  
  219. TTTTWWWWOOOO----PPPPAAAARRRRTTTT NNNNAAAAMMMMEEEESSSS
  220.      The procedures TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr2222, TTTTccccllll____UUUUnnnnttttrrrraaaacccceeeeVVVVaaaarrrr2222, and TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo2222 are
  221.      identical to TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr, TTTTccccllll____UUUUnnnnttttrrrraaaacccceeeeVVVVaaaarrrr, and TTTTccccllll____VVVVaaaarrrrTTTTrrrraaaacccceeeeIIIInnnnffffoooo,
  222.      respectively, except that the name of the variable has already been
  223.      separated by the caller into two parts.  _N_a_m_e_1 gives the name of a scalar
  224.      variable or array, and _n_a_m_e_2 gives the name of an element within an
  225.      array.  If _n_a_m_e_2 is NULL it means that either the variable is a scalar or
  226.      the trace is to be set on the entire array rather than an individual
  227.      element (see WHOLE-ARRAY TRACES below for more information).
  228.  
  229.  
  230. AAAACCCCCCCCEEEESSSSSSSSIIIINNNNGGGG VVVVAAAARRRRIIIIAAAABBBBLLLLEEEESSSS DDDDUUUURRRRIIIINNNNGGGG TTTTRRRRAAAACCCCEEEESSSS
  231.      During read and write traces, the trace procedure can read, write, or
  232.      unset the traced variable using TTTTccccllll____GGGGeeeettttVVVVaaaarrrr2222, TTTTccccllll____SSSSeeeettttVVVVaaaarrrr2222, and other
  233.      procedures.  While _p_r_o_c is executing, traces are temporarily disabled for
  234.      the variable, so that calls to TTTTccccllll____GGGGeeeettttVVVVaaaarrrr2222 and TTTTccccllll____SSSSeeeettttVVVVaaaarrrr2222 will not cause
  235.      _p_r_o_c or other trace procedures to be invoked again.  Disabling only
  236.      occurs for the variable whose trace procedure is active;  accesses to
  237.      other variables will still be traced.  However, if a variable is unset   |
  238.      during a read or write trace then unset traces will be invoked.
  239.  
  240.      During unset traces the variable has already been completely expunged.
  241.      It is possible for the trace procedure to read or write the variable, but
  242.      this will be a new version of the variable.  Traces are not disabled
  243.      during unset traces as they are for read and write traces, but existing
  244.      traces have been removed from the variable before any trace procedures
  245.      are invoked.  If new traces are set by unset trace procedures, these
  246.      traces will be invoked on accesses to the variable by the trace
  247.      procedures.
  248.  
  249.  
  250. CCCCAAAALLLLLLLLBBBBAAAACCCCKKKK TTTTIIIIMMMMIIIINNNNGGGG
  251.      When read tracing has been specified for a variable, the trace procedure
  252.      will be invoked whenever the variable's value is read.  This includes sssseeeetttt
  253.      Tcl commands, $$$$-notation in Tcl commands, and invocations of the
  254.      TTTTccccllll____GGGGeeeettttVVVVaaaarrrr and TTTTccccllll____GGGGeeeettttVVVVaaaarrrr2222 procedures.  _P_r_o_c is invoked just before the
  255.      variable's value is returned.  It may modify the value of the variable to
  256.      affect what is returned by the traced access.  If it unsets the variable |
  257.      then the access will return an error just as if the variable never       |
  258.  
  259.  
  260.  
  261.                                                                         PPPPaaaaggggeeee 4444
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))                                          TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))
  269.  
  270.  
  271.  
  272.      existed.
  273.  
  274.      When write tracing has been specified for a variable, the trace procedure
  275.      will be invoked whenever the variable's value is modified.  This includes
  276.      sssseeeetttt commands, commands that modify variables as side effects (such as
  277.      ccccaaaattttcccchhhh and ssssccccaaaannnn), and calls to the TTTTccccllll____SSSSeeeettttVVVVaaaarrrr and TTTTccccllll____SSSSeeeettttVVVVaaaarrrr2222 procedures).
  278.      _P_r_o_c will be invoked after the variable's value has been modified, but
  279.      before the new value of the variable has been returned.  It may modify
  280.      the value of the variable to override the change and to determine the
  281.      value actually returned by the traced access.  If it deletes the variable|
  282.      then the traced access will return an empty string.
  283.  
  284.      When unset tracing has been specified, the trace procedure will be
  285.      invoked whenever the variable is destroyed.  The traces will be called
  286.      after the variable has been completely unset.
  287.  
  288.  
  289. WWWWHHHHOOOOLLLLEEEE----AAAARRRRRRRRAAAAYYYY TTTTRRRRAAAACCCCEEEESSSS
  290.      If a call to TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr or TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr2222 specifies the name of an array
  291.      variable without an index into the array, then the trace will be set on
  292.      the array as a whole.  This means that _p_r_o_c will be invoked whenever any
  293.      element of the array is accessed in the ways specified by _f_l_a_g_s.  When an
  294.      array is unset, a whole-array trace will be invoked just once, with _n_a_m_e_1
  295.      equal to the name of the array and _n_a_m_e_2 NULL;  it will not be invoked
  296.      once for each element.
  297.  
  298.  
  299. MMMMUUUULLLLTTTTIIIIPPPPLLLLEEEE TTTTRRRRAAAACCCCEEEESSSS
  300.      It is possible for multiple traces to exist on the same variable.  When
  301.      this happens, all of the trace procedures will be invoked on each access,
  302.      in order from most-recently-created to least-recently-created.  When
  303.      there exist whole-array traces for an array as well as traces on
  304.      individual elements, the whole-array traces are invoked before the
  305.      individual-element traces.  If a read or write trace unsets the variable |
  306.      then all of the unset traces will be invoked but the remainder of the    |
  307.      read and write traces will be skipped.
  308.  
  309.  
  310. EEEERRRRRRRROOOORRRR RRRREEEETTTTUUUURRRRNNNNSSSS
  311.      Under normal conditions trace procedures should return NULL, indicating
  312.      successful completion.  If _p_r_o_c returns a non-NULL value it signifies
  313.      that an error occurred.  The return value must be a pointer to a static
  314.      character string containing an error message.  If a trace procedure
  315.      returns an error, no further traces are invoked for the access and the
  316.      traced access aborts with the given message.  Trace procedures can use
  317.      this facility to make variables read-only, for example (but note that the
  318.      value of the variable will already have been modified before the trace
  319.      procedure is called, so the trace procedure will have to restore the
  320.      correct value).
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.                                                                         PPPPaaaaggggeeee 5555
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334. TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))                                          TTTTccccllll____TTTTrrrraaaacccceeeeVVVVaaaarrrr((((3333TTTTccccllll))))
  335.  
  336.  
  337.  
  338.      The return value from _p_r_o_c is only used during read and write tracing.
  339.      During unset traces, the return value is ignored and all relevant trace
  340.      procedures will always be invoked.
  341.  
  342.  
  343. RRRREEEESSSSTTTTRRRRIIIICCCCTTTTIIIIOOOONNNNSSSS
  344.      A trace procedure can be called at any time, even when there is a
  345.      partially-formed result in the interpreter's result area.  If the trace
  346.      procedure does anything that could damage this result (such as calling
  347.      TTTTccccllll____EEEEvvvvaaaallll) then it must save the original values of the interpreter's
  348.      rrrreeeessssuuuulllltttt and ffffrrrreeeeeeeePPPPrrrroooocccc fields and restore them before it returns.
  349.  
  350.  
  351. UUUUNNNNDDDDEEEEFFFFIIIINNNNEEEEDDDD VVVVAAAARRRRIIIIAAAABBBBLLLLEEEESSSS
  352.      It is legal to set a trace on an undefined variable.  The variable will
  353.      still appear to be undefined until the first time its value is set.  If
  354.      an undefined variable is traced and then unset, the unset will fail with
  355.      an error (``no such variable''), but the trace procedure will still be
  356.      invoked.
  357.  
  358.  
  359. TTTTCCCCLLLL____TTTTRRRRAAAACCCCEEEE____DDDDEEEESSSSTTTTRRRROOOOYYYYEEEEDDDD FFFFLLLLAAAAGGGG
  360.      In an unset callback to _p_r_o_c, the TCL_TRACE_DESTROYED bit is set in _f_l_a_g_s
  361.      if the trace is being removed as part of the deletion.  Traces on a
  362.      variable are always removed whenever the variable is deleted;  the only
  363.      time TCL_TRACE_DESTROYED isn't set is for a whole-array trace invoked
  364.      when only a single element of an array is unset.
  365.  
  366.  
  367. TTTTCCCCLLLL____IIIINNNNTTTTEEEERRRRPPPP____DDDDEEEESSSSTTTTRRRROOOOYYYYEEEEDDDD
  368.      When an interpreter is destroyed, unset traces are called for all of its
  369.      variables.  The TCL_INTERP_DESTROYED bit will be set in the _f_l_a_g_s
  370.      argument passed to the trace procedures.  Trace procedures must be
  371.      extremely careful in what they do if the TCL_INTERP_DESTROYED bit is set.
  372.      It is not safe for the procedures to invoke any Tcl procedures on the
  373.      interpreter, since its state is partially deleted.  All that trace
  374.      procedures should do under these circumstances is to clean up and free
  375.      their own internal data structures.
  376.  
  377.  
  378. BBBBUUUUGGGGSSSS
  379.      Tcl doesn't do any error checking to prevent trace procedures from
  380.      misusing the interpreter during traces with TCL_INTERP_DESTROYED set.
  381.  
  382.  
  383. KKKKEEEEYYYYWWWWOOOORRRRDDDDSSSS
  384.      clientData, trace, variable
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.                                                                         PPPPaaaaggggeeee 6666
  394.  
  395.  
  396.  
  397.